home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Hacks / Hacks ’96 / Menu Thief / main.cp next >
Text File  |  1996-06-21  |  2KB  |  110 lines

  1. // main.cp
  2. // by David Kamholz
  3.  
  4. #include <Retrace.h>
  5.  
  6. inline void SetMBarHeight(void);
  7. void RestoreGrayRgn(void);
  8. pascal void myVBL(register VBLTaskPtr vblTaskPtr:__a0);
  9.  
  10. /*
  11. short v1:0x828;
  12. short h1:0x82A;
  13.  
  14. short v2:0x82C;
  15. short h2:0x82E;
  16. */
  17.  
  18. short v3:0x830;         // mouse y coordinate
  19. //short h3:0x832;     // mouse x coordinate
  20.  
  21. const kMenuBarHeight = 20;
  22. const kMenuDistance = 5;
  23.  
  24. RgnHandle theMenus[kMenuBarHeight+1];
  25. RgnHandle theGrays[kMenuBarHeight];
  26.  
  27. void main(void) 
  28. {
  29.     InitGraf(&qd.thePort);
  30.     InitWindows();
  31.     InitCursor();
  32.     InitDialogs(nil);
  33.     InitMenus();
  34.     TEInit();
  35.     
  36.     Handle theMenu = GetNewMBar(128);
  37.     SetMenuBar(theMenu);
  38.     DrawMenuBar();
  39.         
  40.     FlushEvents(everyEvent, -1L);    
  41.     
  42.     RgnHandle grayRgn = LMGetGrayRgn();
  43.     
  44.     short i;
  45.     
  46.     for (i = kMenuBarHeight; i >= 0; i--) {
  47.         theMenus[i] = NewRgn();
  48.         
  49.         CopyRgn(grayRgn, theMenus[i]);
  50.         if (i == kMenuBarHeight) continue;
  51.  
  52.         theGrays[i] = NewRgn();
  53.         
  54.         Rect mBarRect;
  55.         SetRect(&mBarRect,
  56.             qd.screenBits.bounds.left,
  57.             qd.screenBits.bounds.top + i,
  58.             qd.screenBits.bounds.right,
  59.             qd.screenBits.bounds.top + kMenuBarHeight); // what was the menu bar but now is not
  60.         RectRgn(theGrays[i], &mBarRect);
  61.         
  62.         UnionRgn(theMenus[i], theGrays[i], theMenus[i]);
  63.     }
  64.     
  65.     VBLTask theVBL;
  66.     theVBL.qType = 1;
  67.     theVBL.vblAddr = NewVBLProc(myVBL);
  68.     theVBL.vblCount = 1; // how often it's called
  69.     theVBL.vblPhase = 0;
  70.     
  71.     OSErr err;
  72.     err = VInstall((QElemPtr)&theVBL);
  73.     
  74.     while (!Button()) ;
  75.     
  76.     err = VRemove((QElemPtr)&theVBL);
  77.  
  78.     LMSetMBarHeight(kMenuBarHeight);
  79.     CopyRgn(theMenus[kMenuBarHeight], grayRgn);
  80.     LMSetGrayRgn(grayRgn);
  81.     DrawMenuBar();
  82.  
  83.     for (i = 0; i < kMenuBarHeight; i++) {
  84.         DisposeRgn(theMenus[i]);
  85.         DisposeRgn(theGrays[i]);
  86.     }
  87.     DisposeRgn(theMenus[kMenuBarHeight]);
  88. }
  89.  
  90. pascal void myVBL(register VBLTaskPtr vblTaskPtr:__a0) {
  91.     if (v3 < kMenuBarHeight+kMenuDistance-1) {
  92.         short which;
  93.         if (v3 < kMenuDistance) which = 0;
  94.         else which = v3 - kMenuDistance + 1;
  95.         
  96.         LMSetMBarHeight(which);
  97.         LMSetGrayRgn(theMenus[which]);
  98.         DrawMenuBar();
  99.         PaintOne(nil, theGrays[which]);
  100.     }
  101.     else {
  102.         if (LMGetMBarHeight() != kMenuBarHeight) {
  103.             LMSetMBarHeight(kMenuBarHeight);
  104.             LMSetGrayRgn(theMenus[kMenuBarHeight]);
  105.             DrawMenuBar();
  106.         }
  107.     }
  108.     
  109.     vblTaskPtr->vblCount = 1; // reset it so it will be called again
  110. }